const {
    exec,
    execSync,
    spawn,
    spawnSync,
    execFile,
    execFileSync,
    fork
} = require('child_process')
const path = require('path')

// 1.exec 异步的方法，回调函数，返回buffer，可以帮我们执行shell命令，或者跟软件交互
// exec('node -v', (error,stdout,stderr)=>{
//     if(error){
//         return error
//     }
//     console.log(stdout.toString())
// })

// 2.execSync 同步方法
// 适合执行较小的shell命令 想要立马拿到结果的shell。
// 缺点：字节上限200kb
/*const nodeVersion = execSync('node -v')  //buffer
console.log(nodeVersion.toString())
execSync('start chrome http://www.baidu.com')*/

// 3.spawn  没有字节上限，返回的是个流，并且是实时返回
// 4.spawnSync 用的少
/*const {stdout} = spawn('netstat')
stdout.on('data', (msg)=>{
    console.log(msg.toString())
})

stdout.on('close', ()=>{
    console.log('结束了')
})*/

// 5.execFile 执行可执行的文件
// nodejs 16可以执行，nodejs 18及以上会报错
/* execFile(path.resolve(__dirname, './bat.cmd'), [], (err, stdout) => {
    console.log(stdout.toString());
}) */
// nodejs 16 及更早版本会自动在 Windows 上使用 cmd.exe 解释 .cmd 文件
// nodejs 18 开始 不再自动使用 cmd.exe 来运行 .cmd 或 .bat 文件，而是会尝试直接执行该文件（类似在 Linux 上执行 .sh 文件）。
// 由于 .cmd 文件本身不是可执行程序（只是脚本），所以会报错。
// nodejs 18可以这样写
/* execFile('cmd.exe', ['/c', path.resolve(__dirname, './bat.cmd')], (err, stdout, stderr) => {
    console.log(stdout.toString());
}); */

// exec通过execFile实现，execFile通过spawn实现

// 6.fork 只能接受js模块
// 可以把耗时的代码给子进程执行
const testProcess = fork('./childProcess.js')
testProcess.send('我是主进程')

testProcess.on('message',(res)=>{
    console.log(res)
})